package com.itany.corejava.code16_反射;

import java.lang.annotation.*;

/**
 * @author 石小俊
 * @date 2023年06月01日 13:52
 */
// @Target注解的值如果只有一个,直接指定一个
// @Target(value= ElementType.FIELD)
// 如果注解的值有多个,通过大括号来指定多个
// @Target(value= {ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
// 所有注解中,如果注解属性有且仅有value,那么value可以省略,直接写属性值
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SomeAnnotation {

    // 定义注解属性时,每一个属性对应一个抽象方法
    // 虽然其是一个抽象方法,但是我们认为它是属性的作用
    // 可以通过default为属性设置默认值
    // 当使用该注解时,如果没有为指定属性赋值,则使用默认值
    // 如果所有的注解属性都有默认值,在使用注解的时候可以不指定任何属性
    // 但是如果有任意一个属性没有设置默认值,在使用时必须指定对应属性的值
    String name() default "admin";

    String[] value() default {"Hello", "World"};

    int age() default 20;

}
